 
#define GPIOB_BASE 0x40010C00
#define GPIOC_BASE 0x40011000
#define GPIOA_BASE 0x40010800

#define RCC_APB2ENR (*(unsigned int *)0x40021018)

#define GPIOB_CRL (*(unsigned int *)0x40010C00)
#define GPIOC_CRH (*(unsigned int *)0x40011004)
#define GPIOA_CRL (*(unsigned int *)0x40010800)

#define GPIOB_ODR (*(unsigned int *)0x40010C0C)
#define GPIOC_ODR (*(unsigned int *)0x4001100C)
#define GPIOA_ODR (*(unsigned int *)0x4001080C)
	


void SystemInit(void);
void Delay_ms(volatile  unsigned  int);

void Delay_ms( volatile  unsigned  int  t)
{
     unsigned  int  i;
     while(t--)
         for (i=0;i<800;i++);
}


int main(){
	// ????
	RCC_APB2ENR |= (1<<3); // ?? GPIOB ??
	RCC_APB2ENR |= (1<<4); // ?? GPIOC ??
	RCC_APB2ENR |= (1<<2); // ?? GPIOA ??
	
	
	// ?? GPIO ?????
	// ?? GPIOB ????? 0001 (B0)
	GPIOB_CRL |= (1<<0);  // ???????1
	GPIOB_CRL &= ~(0xE);  // ???????????0
	// ?? GPIOC ???? 0001  (C15)
	GPIOC_CRH |= (1<<28); // ??????1
	GPIOC_CRH &= ~(0xE0000000);  // ??????0
	// ?? GPIOA ????? 0001 (A0)
	GPIOA_CRL |= (1<<0);  // ???????1
	GPIOA_CRL &= ~(0xE);  // ???????????0

	
	// 3?LED??????(????)
	GPIOB_ODR |= (1<<0);  // ???????1
	GPIOC_ODR |= (1<<15); // ???15????1
	GPIOA_ODR |= (1<<0);  // ???????1
	
	
	while(1){
		GPIOB_ODR &= ~(1<<0); // ??1
		Delay_ms(1000);
		GPIOB_ODR |= (1<<0);  // ??1
		Delay_ms(1000);
		
		GPIOC_ODR &= ~(1<<15); // ??2
		Delay_ms(1000);
		GPIOC_ODR |= (1<<15);  // ??2
		Delay_ms(1000);
		
		GPIOA_ODR &= ~(1<<0); // ??3
		Delay_ms(1000);
		GPIOA_ODR |= (1<<0);  // ??3
		Delay_ms(1000);
		
	}
	
}


void SystemInit(){
	
}
